package de.ihk.beans;

import java.io.IOException;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;


import de.ihk.data.Aufgabe;
import de.ihk.data.Test;
import de.ihk.datamanagment.MysqlConnector;

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@ManagedProperty("#{loginBean}")
	private LoginBean login;

	private List<Test> Tests;
	private Test[] selectedTests;

	private int id = 0;
	private String newSemester;
	private String newFachgebiet;
	private String newName;
	private String newDatum;
	private String Bearbeiter;
	private int aufgabeId;
	private Aufgabe aufgabe;
	private String aufgabeName = "";

	private ResultSet rs = null;
	private MysqlConnector conn = null;

	public TestBean() throws ClassNotFoundException, SQLException {
		Tests = new ArrayList<Test>();
		System.out.println("TestBean erzeugt: " + System.currentTimeMillis());
		conn = new MysqlConnector();
		updateList();
	}

	// OUTDATED Wird nicht mehr benutzt
	/**
	 * public void submit(ActionEvent actionEvent) throws SQLException {
	 * System.out.println(id); System.out.println(newSemester + " " + newName);
	 * conn.addTestToDb(id, newSemester, newFachgebiet, newName, newDatum,
	 * Bearbeiter); updateList(); }
	 **/

	public void updateList() throws SQLException {
		rs = conn.getTests();
		Tests.removeAll(Tests);
		while (rs.next()) {
			Tests.add(new Test(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs
					.getInt(7)));

		}

	}

	public void deleteSelected(ActionEvent actionEvent) throws SQLException {
		for (Test i : selectedTests) {
			System.out.println(i.getId());
			conn.mysqlUpdateQuery("DELETE FROM tests WHERE id = " + i.getId() + ";");

		}
		updateList();
	}

	public void deleteAll(ActionEvent actionEvent) throws SQLException {
		conn.mysqlUpdateQuery("TRUNCATE tests");
		updateList();
	}

	public List<String> completeSemester(String query) {
		List<String> results = new ArrayList<String>();
		for (Test auf : Tests) {
			if (auf.getSemester().toLowerCase().startsWith(query.toLowerCase())) {
				results.add(auf.getSemester());
				System.out.println("SEMESTER GEFUNDEN");
			}
		}
		return results;

	}

	public List<String> completeFachgebiet(String query) {
		List<String> results = new ArrayList<String>();
		for (Test auf : Tests) {
			if (auf.getFachgebiet().toLowerCase().startsWith(query.toLowerCase())) {
				results.add(auf.getFachgebiet());
				System.out.println("Fachgebiet GEFUNDEN");
			}
		}
		return results;

	}

	public void bearbeiteSelected(ActionEvent actionEvent) throws SQLException, ClassNotFoundException, IOException {
		FacesContext context = FacesContext.getCurrentInstance();
		rs = conn.getAufgaben();
		if (selectedTests.length == 0) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fehler", "Bitte einen Test auswählen!"));
		} else if (selectedTests.length > 1) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fehler", "Bitte nur einen Test auswählen!"));
		} else {
			if (selectedTests[0].getAufgabenId() == -1) {
				System.out.println("Neue Aufgabe für Test, da noch keiner vorhanden mit ID: " + selectedTests[0].getId());
				aufgabe = new Aufgabe(selectedTests[0].getId(), "Neue Aufgabe");
				conn.addAufgabenObjectToDb(selectedTests[0].getId(), aufgabe.getClass().getName(), aufgabe);
				conn.mysqlUpdateQuery("UPDATE tests SET aufgabenid = " + selectedTests[0].getId() + " WHERE id = " + selectedTests[0].getId() + ";");
				selectedTests[0].setAufgabenId(selectedTests[0].getId());
				login.setSelectedTest(selectedTests[0]);
				login.setSelectedAufgabe(aufgabe);
				System.out.println("NEU Selected Test AufgabenID = "+selectedTests[0].getAufgabenId());
				System.out.println("NEU Selected Aufgabe ID = "+ aufgabe.getId());
				login.doRedirect("bearbeitetest.xhtml");
			} else {
				while (rs.next()) {
					if (selectedTests[0].getAufgabenId() == rs.getInt(1)) {
						System.out.println("");
						aufgabe = (Aufgabe) conn.deSerializeJavaObjectFromDB(selectedTests[0].getAufgabenId());
						login.setSelectedTest(selectedTests[0]);
						login.setSelectedAufgabe(aufgabe);
						System.out.println(aufgabeName);
						System.out.println("Selected Test AufgabenID = "+selectedTests[0].getAufgabenId());
						System.out.println("Selected Aufgabe ID = "+ aufgabe.getId());
						login.doRedirect("bearbeitetest.xhtml");
					}
				}

			}
		}

	}

	// ----- Setter und Getter

	public void setLogin(LoginBean login) {
		this.login = login;
	}

	public List<Test> getTests() {
		return Tests;
	}

	public void setTests(List<Test> Tests) {
		this.Tests = Tests;
	}

	public Test[] getSelectedTests() {
		return selectedTests;
	}

	public void setSelectedTests(Test[] selectedTests) {
		this.selectedTests = selectedTests;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getNewSemester() {
		return newSemester;
	}

	public void setNewSemester(String newSemester) {
		this.newSemester = newSemester;
	}

	public String getNewFachgebiet() {
		return newFachgebiet;
	}

	public void setNewFachgebiet(String newFachgebiet) {
		this.newFachgebiet = newFachgebiet;
	}

	public String getNewName() {
		return newName;
	}

	public void setNewName(String newName) {
		this.newName = newName;
	}

	public String getNewDatum() {
		return newDatum;
	}

	public void setNewDatum(String newDatum) {
		this.newDatum = newDatum;
	}

	public String getBearbeiter() {
		return Bearbeiter;
	}

	public void setBearbeiter(String bearbeiter) {
		Bearbeiter = bearbeiter;
	}

	public int getAufgabeId() {
		return aufgabeId;
	}

	public void setAufgabe(int aufgabeId) {
		this.aufgabeId = aufgabeId;
	}

	public Aufgabe getAufgabe() {
		return aufgabe;
	}

	public void setAufgabe(Aufgabe aufgabe) {
		this.aufgabe = aufgabe;
	}

	public void setAufgabeId(int aufgabeId) {
		this.aufgabeId = aufgabeId;
	}

	public String getAufgabeName() {
		return aufgabeName;
	}

	public void setAufgabeName(String aufgabeName) {
		this.aufgabeName = aufgabeName;
	}

}
